/*
 * debugcmd.h
 *
 *  Created on: 2020年2月24日
 *      Author: wangbing
 *      Email : mz8023yt@163.com
 */

#ifdef __cplusplus
extern "C"
{
#endif

#ifndef MAZ_DEBUGCMD_H_
#define MAZ_DEBUGCMD_H_

#include "list.h"
#include "debug.h"
#include "debugcmd_config.h"

/* 1. TYPE: Data type */
#define uint8_t             unsigned char
#define uint16_t            unsigned short
#define uint32_t            unsigned int

/* 2. MAZRET: State code returned */
#define MTRUE               1
#define MFALSE              0
#define MAZRET_TRUE         MTRUE
#define MAZRET_FALSE        MFALSE
#define MENABLE             1
#define MDISABLE            0
#define MAZRET_ENBALE       MENABLE
#define MAZRET_DISABLE      MDISABLE

#define MAZRET_REMOTECMD    100

#define MAZRET_OK           0
#define MAZRET_NG           -1
#define MAZRET_EINVAL       -2      /* Invalid argument */
#define MAZRET_ENOITEM      -3      /* No such item */
#define MAZRET_ENOCMD       -4      /* No such command */
#define MAZRET_ENOSUBCMD    -5      /* No such sub command */
#define MAZRET_ENULLP       -6      /* Null pointer exception */
#define MAZRET_EEXIST       -7      /* File exists */
#define MAZRET_EEXE         -8      /* Command exe fail */
#define MAZRET_ENEWLINE     -9      /* New line */
#define MAZRET_EAUTO        -10     /* Auto completion */
#define MAZRET_ERING        -11     /* Ring */
#define MAZRET_EDEV         -12     /* No devices */

/**
 * @brief 调试命令组件版本号
 */
#define DEBUGCMD_MAIN_VER       1
#define DEBUGCMD_SUB_VER        2
#define DEBUGCMD_REV_VER        0

/**
 * @brief 命令回调函数原型
 */
typedef int (*DEBUGCMD_HANDLER)(void *cmd, char *param);

/**
 * @brief 子命令类型
 */
typedef struct _DEBUGCMD_SUB_CMD_
{
    char *name;                         // 子命令名称
    char *desc;                         // 子命令描述信息
    DEBUGCMD_HANDLER handler;           // 子命令回调函数
    struct list_head list;              // 子命令链表成员
    int registered;                     // 是否注册标记
} DEBUGCMD_SCMD;

/**
 * @brief 主命令类型
 */
typedef struct _DEBUGCMD_MAIN_CMD_
{
    char *name;                         // 主命令名称
    char *desc;                         // 主命令描述信息
    DEBUGCMD_HANDLER handler;           // 主命令回调函数, 遍历子命令链表, 并打印字命令的描述信息
    DEBUGCMD_SCMD cmds;                 // 主命令下绑定的子命令链表
    struct list_head list;              // 主命令链表成员
    int registered;                     // 是否注册标记
} DEBUGCMD_MCMD;

/**
 * @brief API接口
 */
int debugcmd_init(void);
int debugcmd_deinit(void);
int debugcmd_mcmd_register(DEBUGCMD_MCMD *mcmd);
int debugcmd_mcmd_unregister(DEBUGCMD_MCMD *mcmd);
int debugcmd_scmd_register(DEBUGCMD_MCMD *mcmd, DEBUGCMD_SCMD *scmd);
int debugcmd_scmd_unregister(DEBUGCMD_SCMD *scmd);
int debugcmd_execute(char *str);
int debugcmd_automatic_completion(char *str, char *fill, int *length);
int debugcmd_export(char *filename);
int debugcmd_param_only_space(char *str);

#endif /* MAZ_DEBUGCMD_H_ */

#ifdef __cplusplus
}
#endif
